// JavaScript原型和继承 http://blog.jobbole.com/19795/
// 代码实践

function A() {
    this.name = "A";
    this.data = [1,2,3];
};

A.prototype.sayMe = function () {
    console.log("this is A");
}

console.log(A.prototype.sayMe());

function B() {
};

console.log("B.prototype.constructor = " + B.prototype.constructor)

B.prototype = A.prototype; //相当于把B的prototype指向了A的prototype；这样只是继承了A的prototype方法，A中的自定义方法则不继承

console.log("B.prototype.constructor = " + B.prototype.constructor)
B.prototype.thisisb = "this is constructor B"; //这样也会改变a的prototype
console.log(A.prototype.thisisb)

// 上面因为共享了A.prototype 所以导致A和B的prototype都会变化， 这不是我们期望的

console.log("===正确的继承===");
B.prototype = new A();
var b = new B();
console.log("b 的构造： " + b.constructor); // 指向A
B.prototype.constructor = B;

console.log("b 的构造： " + b.constructor); // 指向A

B.prototype.constructor = B;
//现在B的原型就变成了{width :10 , data : [1,2,3] , key : "this is A" , [[Prototype]] : A.prototype , constructor : B}
console.log(b.constructor);//output B
//同时B直接通过原型继承了A的自定义属性width和name
console.log(b.data);//output [1,2,3]
//这样的坏处就是
b.data.push(4);//直接改变了prototype的data数组（引用）
var c = new B;
console.log(c.data);//output [1,2,3,4]
//其实我们想要的只是原型链，A的自定义属性我们想在B中进行定义（而不是在prototype）
//该如何进行继承？
//既然我们不想要A中自定义的属性，那么可以想办法把其过滤掉
//可以新建一个空函数
function F(){}
//把空函数的原型指向构造函数A的原型
F.prototype = A.prototype;
//这个时候再通过new操作把B.prototype的原型链指向F的原型
B.prototype = new F;
//这个时候B的原型变成了{[[Prototype]] : F.prototype}
//这里F.prototype其实只是一个地址的引用
//但是由B创建的实例其constructor指向了A，所以这里要显示设置一下B.prototype的constructor属性
B.prototype.constructor = B;
//这个时候B的原型变成了{constructor : B , [[Prototype]] : F.prototype}
//这样就实现了B对A的原型继承
